"""
@Author  : 康帅
@Time    : 2021/6/16 16:21
@Function: 
"""

import functools

"""
partial() 返回的是一个可调用对象，可以直接使用；
而 partialmethod() 返回的是一个可调用方法，
可以用作一个对象的非绑定方法。
在下例中，将相同的独立函数作为 MyClass 的属性添加了两次，
一次是使用 partialmethod() 作为 method1() ，
另一次是使用 partial() 作为 method2()
"""


def standalone(self, a=1, b=2):
    """独立函数"""
    print('  called standalone with:', (self, a, b))
    if self is not None:
        print('self.attr=', self.attr)


class MyClass:
    """工具箱（functools）的示范类"""

    def __init__(self):
        self.attr = 'instance attribute'

    method1 = functools.partialmethod(standalone)
    method2 = functools.partial(standalone)


o = MyClass()
print('standalone')
standalone(None)
print()

print('method1 as partialmethod')
o.method1()
print()

print('method2 as partial')
try:
    o.method2()
except TypeError as err:
    print('ERROR: {}'.format(err))
